package com.ruoyi.common.core.domain;

import java.util.HashMap;

import com.fasterxml.jackson.core.format.DataFormatDetector;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;

/**
 * 操作消息提醒
 *
 * @author ruoyi
 */
public class AjaxResult extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;

    /**
     * 状态码
     */
    public static final String CODE_TAG = "code";

    /**
     * 返回内容
     */
    public static final String MSG_TAG = "msg";

    /**
     * XiaoYi...
     * 返回内容英文
     *
     * @Date : 2020-03-08 22:18
     */
    public static final String MSGE_TAH = "msgE";

    /**
     * 数据对象
     */
    public static final String DATA_TAG = "data";

//    public static void main(String asg[]) {
//        System.out.println(new AjaxResult("1002","错误","cuowu",null,"输入错误"));
//    }

    /**
     * XiaoYi...
     *
     * @Date : 2020-03-08 22:13
     * 返回异常代码
     */
    public static final String Exception_TAG = "exception";

    /**
     * 状态类型
     */
    public enum Type {
        /**
         * 成功
         */
        SUCCESS(0),
        /**
         * 成功
         */
        successful(200),

        /**
         * 警告
         */
        WARN(301),
        /**
         * 错误
         */
        ERROR(500);
        private final int value;

        Type(int value) {
            this.value = value;
        }

        public int value() {
            return this.value;
        }
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
     */
    public AjaxResult() {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg  返回内容
     */
    public AjaxResult(Type type, String msg) {
        super.put(CODE_TAG, type.value);
        super.put(MSG_TAG, msg);
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg  返回内容
     * @param data 数据对象
     */
    public AjaxResult(Type type, String msg, Object data) {
        super.put(CODE_TAG, type.value);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data)) {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * XiaoYi...
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code      状态类型
     * @param msg       返回内容（中文）
     * @param msgE      返回内容（英文）
     * @param data      数据对象
     * @param exception 异常信息
     * @Date : 2020-03-08 22:19
     */
    public AjaxResult(String code, String msg, String msgE, Object data, String exception) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(msgE))
            super.put(MSGE_TAH, msgE);
        if (StringUtils.isNotNull(exception))
            super.put(Exception_TAG, exception);
        if (StringUtils.isNotNull(data))
            super.put(DATA_TAG, data);
    }

    //todo 完善反馈信息，重新包装反馈

    /**
     * XiaoYi...
     * 重新包装返回参数
     * code 返回参数请查看 messages 文件
     * 2020 7 26 11:05
     *
     * @param code
     * @return
     */

    public static AjaxResult result_XY(String code) {
        String message = MessageUtils.message(code, null);
        return new AjaxResult(code, message, null, null, null);
    }
    public static AjaxResult result_XY(String code, Object data) {
        String message = MessageUtils.message(code, null);
        return new AjaxResult(code, message, null, data, null);
    }

    public static AjaxResult result_XY_SUCCES(Object data) {
        String message = MessageUtils.message("200", null);
        return new AjaxResult("200", message, message, data, null);
    }

    /**
     * XiaoYi...
     * 重新包装返回参数
     *
     * @Date : 2020-03-09 08:46
     */
    public static AjaxResult result(String code) {
        return result(code, null, null);
    }

    /**
     * XiaoYi...
     * 重新包装返回参数
     *
     * @Date : 2020-03-09 08:46
     */
    public static AjaxResult result(String code, Object data) {
        return result(code, data, null);
    }

    /**
     * XiaoYi...
     * 重新包装返回参数
     *
     * @Date : 2020-03-09 08:46
     */
    public static AjaxResult result(String code, Object data, String exception) {
        switch (code) {

            case "200": {
                return new AjaxResult(code, "请求成功", "success", data, exception);
            }
            //条形码生成器
            case "1000": {
                return new AjaxResult(code, "条形码生成成功", "Bar code generated successfully", data, exception);
            }
            case "1001": {
                return new AjaxResult(code, "条形码配置信息错误", "Barcode configuration information error", data, exception);
            }
            case "1002": {
                return new AjaxResult(code, "生成文件个数大于条码总个数", "The number of generated files is greater than the number of bar codes", data, exception);
            }
            case "1003": {
                return new AjaxResult(code, "条形码数量小于1", "The number of bar codes is less than 1", data, exception);
            }
            case "1004": {
                return new AjaxResult(code, "验证密码错误", "Verify password error", data, exception);
            }
            case "1005": {
                return new AjaxResult(code, "验证密码成功", "Password verification successful", data, exception);
            }
            //条形码
            case "2001": {
                return new AjaxResult(code, "失败", "error", data, exception);
            }
            case "2002": {
                return new AjaxResult(code, "成功", "success", data, exception);
            }

            //批量生成条码
            case "8001": {
                return new AjaxResult(code, "数据源切换成功", "Data source switch successful", data, exception);
            }
            case "8002": {
                return new AjaxResult(code, "数据源切换失败", "Data source switch failed", data, exception);
            }
            case "0": {
                return new AjaxResult(code, "", "", data, exception);
            }

            default: {
                return new AjaxResult(code, "失败", "Error", data, exception);
            }
        }
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static AjaxResult success() {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static AjaxResult success(Object data) {
        return AjaxResult.success("操作成功", data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg) {
        return AjaxResult.success(msg, null);
    }


    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static AjaxResult successful() {
        return AjaxResult.successful("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static AjaxResult successful(Object data) {
        return AjaxResult.successful("操作成功", data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult successful(String msg) {
        return AjaxResult.successful(msg, null);
    }


    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data) {
        return new AjaxResult(Type.SUCCESS, msg, data);
    }

    public static AjaxResult successful(String msg, Object data) {
        return new AjaxResult(Type.successful, msg, data);
    }


    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult warn(String msg) {
        return AjaxResult.warn(msg, null);
    }

    /**
     * 返回警告消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult warn(String msg, Object data) {
        return new AjaxResult(Type.WARN, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static AjaxResult error() {
        return AjaxResult.error("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(String msg) {
        return AjaxResult.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult error(String msg, Object data) {
        return new AjaxResult(Type.ERROR, msg, data);
    }
}
